package main

import "fmt"

/*
位运算符介绍

	位运算符对整数在内存中的二进制位进行操作，比一般的算术运算符速度要快，而且可以实现一些算术运算符不能实现的功能。
	如果要开发高效率程序，位运算符是必不可少的。位运算符用来对二进制位进行操作，包括：按位与（＆）、按位或（|）、按位异或（^）、按位左移（＜＜）、按位右移（＞＞）
*/
func main() {

	a := 60 // 0011 1100
	b := 13 // 0000 1101

	/*
		按位与（＆）
	*/
	fmt.Println(a & b) // 0000 1100 即为 4 + 8 = 12

	/*
		按位或（|）
	*/
	fmt.Println(a | b) // 0011 1101 即为 1 + 4 + 8 + 16 + 32 = 61

	/*
		按位异或（^）
	*/
	fmt.Println(a ^ b) // 0011 0001 即为 1+ 16 + 32 = 49

	/*
		按位左移（＜＜）
		TIPS：在数字范围没有溢出的前提下，对于正数和负数，左移1位都相当于乘以2的1次方，左移n位就相当于乘以2的n次方
	*/
	fmt.Println(a << 2)  // 左移两位，数学意义即为 a 乘以 2 的 2次方的意思 = 240
	fmt.Println(-a << 2) // 左移两位，数学意义即为 a 乘以 2 的 2次方的意思，然后再加上负号 = -240

	/*
		按位右移（＞＞）
		TIPS：右移1位相当于除以2，右移n位相当于除以2的n次方。需要根据数组类型自动做四舍五入的取舍策略
	*/
	fmt.Println(a >> 2)  // 右移两位，数学意义即为 a 除以 2 的 2 次方的意思 = 15
	fmt.Println(a >> 3)  // 右移两位，数学意义即为 a 除以 2 的 3 次方的意思，除不尽，向下取整 = 7
	fmt.Println(-a >> 2) // 右移两位，数学意义即为 -a 除以 2 的 2 次方的意思	= -15
	fmt.Println(-a >> 3) // 右移两位，数学意义即为 -a 除以 2 的 2 次方的意思，除不尽，向下取整 = -8
}
